--[[
	service，处理入桌码和对应游戏节点，桌子的关系
	类似原来的 tablestatesvr
	最核心的是客户端输完入桌code后，返回给客户端应该去拿个游戏节点node
	这里的节点，在单游戏单节点的时候，和游戏是对应的，但当一个游戏有多个节点的时候
	可能会去多个节点，所以这里定义为 节点 ，感觉更有意义
	主要三个接口：
	一，游戏节点调用，创建自定义桌子，返回一个唯一code， 自己存下 code vs 节点，桌子的对应关系
	二，游戏节点调用，删除取消某张桌子
	三，gate直接来查询，某 code  需要去哪个节点
	TODO:
	四，要求各个gamenode上报桌子情况（hall重启后，还可以再次获得管理列表）
	五，可以代建的时候，列出某些人待建的所有桌子
]]
local filename = "code2nodetable.lua"
local skynet = require "skynet"
require "skynet.manager"
local string = string

local filelog = require "filelog"
local timetool = require "timetool"

local math = math

local CMD = {}

--[[
	入桌码列表 codelist，关键的数据结构，code为key
	code => {
		nodename=> "ddznode"
		table_index=> 123
		create_rid=> rid
		create_time => 123
	}
]]
local codelist = {}

-- 游戏节点调用
-- 入参： 游戏节点名字，创建人，桌子的index，桌子的配置
-- 返回 一个六位的随机入桌码
function CMD.create_table_code(gamenode, table_index, create_rid, conf)
	local code = gencode()
	while (codelist[code])
	do
		code = gencode()
	end
	codelist[code] = {
		nodename = gamenode,
		table_index = table_index,
		create_rid = rid,
		conf = conf,
		create_time = timetool.get_time()
	}
	return code
end

function CMD.gettablebycode( code )
	-- code = tonumber(code)
	if codelist[code] then
		local nodename = codelist[code].nodename
		if string.sub(nodename, -4, -1) == "node" then
			nodename = string.sub(nodename, 1, -5)
		end
		return {nodename=nodename, table_index=codelist[code].table_index}
	else
		return {retcode=-1, retstr="房间不存在"}
	end
end

-- 入参: 游戏节点名字，创建人，桌子的index，
function CMD.del_table_code(code, gamenode, table_index)
	codelist[code] = nil
	return true
end

-- 返回 游戏节点名字， 桌子的index
function CMD.search_code()
	return codelist[code]
end

-- 生成一个在不在codelist的 code
-- 非零开头的6位， 一共是90万种可能
function gencode()
	local newcode = math.random(100000,999999)
	while (codelist[newcode])
	do
		newcode = math.random(100000,999999)
	end
	return newcode
end

skynet.dispatch("lua", function (session, address, command, ...)
	if CMD[command] then
		skynet.retpack(CMD[command](...))
	else
		skynet.retpack(false)
	end
end)

skynet.start(function ()
	math.randomseed(os.time())
end)
